package com.liyuan.entity;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.*;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

/**
 * 自定义输入格式，用于处理存储在内存中的数组数据。
 */
public class ArrayInputFormat extends InputFormat<LongWritable, Text> {
    private static final Logger LOG = Logger.getLogger(ArrayInputFormat.class);

    /**
     * 根据作业上下文获取输入分片列表。
     *
     * @param context 作业上下文。
     * @return 输入分片列表，这里返回单个分片。
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    public List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException {
        Configuration conf = context.getConfiguration();
        String[] dataArray = conf.getStrings("array.data"); // 从配置中读取数组数据
        // System.out.println(dataArray[0]);
        if (dataArray == null || dataArray.length == 0) {
            throw new IllegalArgumentException("Array data not found in configuration.");
        }
        ArraySplit split = new ArraySplit(dataArray);
        // System.out.println(Collections.singletonList(split).iterator().next());
        return Collections.singletonList(split);
    }

    /**
     * 创建记录读取器。
     *
     * @param split   输入分片。
     * @param context 任务尝试上下文。
     * @return 新的记录读取器实例。
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    public RecordReader<LongWritable, Text> createRecordReader(InputSplit split, TaskAttemptContext context)
            throws IOException, InterruptedException {
        ArrayRecordReader arrayRecordReader = new ArrayRecordReader();
        arrayRecordReader.initialize(split, context);
        return arrayRecordReader;
    }
}
